package generice;

/**
 * 测试泛型
 */
public class Demo1 {
    public static void main(String[] args) {
        //如果不指定泛型，那么泛型则为默认的原型：Object
        TransferObject o = new TransferObject();
        o.setSender("范传奇");
        o.setReceiver("王克晶");
        o.setData("你好！");    //setData(T t) T:Object
        o.setData(123);        //自动装箱:Integer.valueOf(123);

        TransferObject<String> o1 = new TransferObject<>(); // T这里就是String
        //o1.setData(123);  //编译错误，实参类型不符合泛型要求
        o1.setData("你好");

        TransferObject<Integer> o2 = new TransferObject<>(); // T这里就是Integer
        //o2.setData("你好");  //编译错误，实参类型不符合泛型要求
        o2.setData(123);      //触发系统自动装箱int-Integer

        //如果没有指定泛型：
        Object d = o.getData(); //接收泛型返回值时也需要使用原型Object
        String s = (String)o.getData();//获取实际类型需要自行造型（但可能存在类造型异常）

        //o1实例化时，已经指定为String类型，因此获取时无需再造型
        String s1=o1.getData();//获取时，public T getData() 中 T这里已经是String
        int i = o2.getData();  //同理o2,也已经指定为Integer，可用int接收，编译器自动拆箱补充造型操作
    }
}
